// 第三方应用
const express = require('express')
const mongoose = require('mongoose')
const cookieParser = require('cookie-parser')
const bodyParser = require('body-parser')
const cors = require('cors')
const {Server} = require('socket.io')

// 自定义应用和服务
// 数据库配置
const dataSource = require('./config/DataSource')
// 全局 API
const apiAddr = require('./config/PublicApi')
// 图片上传服务
const uploadImgFileApp = require('./service/files/img.file.upload.service')
// 获取图片服务
const getImgFileApp = require('./service/files/img.file.get.service')
// 用户注册服务
const registerApp = require('./service/users/register.service')
// 用户登录服务
const loginApp = require('./service/users/login.service')
// 用户鉴权服务
const authorizationApp = require('./service/users/authorization.service')
// 博客文章服务
const blogApp = require('./service/blogs/blog.service')
// 用户详情操作服务（点赞、关注、拉黑）
const userDetailApp = require('./service/users/userDetails.service')
// 举报处理服务
const tip_off_App = require('./service/tip-off/tip_off.service')
// 后台管理系统服务
const sys_adminApp = require('./service/admin/sys_admin.service')

// 连接数据库
mongoose.set('strictQuery', true)
const dbUrl = `${dataSource.databaseType}://${dataSource.host}:${dataSource.port}/${dataSource.database}`
mongoose.connect(dbUrl, {
  useNewUrlParser: true,
  useUnifiedTopology: true
}).then(() => {
  console.log('app.js: 数据库连接成功！')
}).catch(err => {
  console.log('app.js: 数据库连接失败！ ' + err.message)
})

// 服务实例
const app = express()

// 启用通用中间件
app.use(cors())                                     // 处理跨域
app.use(cookieParser())                             // 简化 cookie 处理
app.use(bodyParser.json())                          // 自动解析主体数据
app.use(bodyParser.urlencoded({ extended: true }))

// 允许前端获取到自定义的响应头字段
app.all('*', (req, res, next) => {
  res.setHeader('Access-Control-Expose-Headers', '*')
  next()
})

// 挂载自定义应用 把接口分模块 分别交给不同的服务去处理
try {
  app.use(apiAddr.uploadImgApiAddr, uploadImgFileApp)
  app.use(apiAddr.getImgApiAddr, getImgFileApp)
  app.use(apiAddr.registerApiAddr, registerApp)
  app.use(apiAddr.loginApiAddr, loginApp)
  app.use(apiAddr.authorizationApiAddr, authorizationApp)
  app.use(apiAddr.blogApiAddr, blogApp)
  app.use(apiAddr.userDetailApiAddr, userDetailApp)
  app.use(apiAddr.tipOffApiAddr, tip_off_App)
  app.use(apiAddr.sysAdminApiAddr, sys_adminApp)
  console.log('app.js: 所有接口服务启动成功！')
} catch (e) {
  console.log('app.js: 接口服务启动失败！' + e)
}

// 启动服务
const port = process.env.PORT || 8000

app.listen(port, () => {
  console.log('app.js: 枫桪物语后台服务启动，端口：' + port)
  // 启动 socket
  const io = require('./tools/socket')
  io.listen(3333)
  console.log('app.js: Socket 监听端口： 3333');
})



